﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Schedule.Planning.Pics
{
    /// <summary>
    /// Ikony 16x16 px
    /// </summary>
    public class PicLibrary16
    {
		#region Image CompStock
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_stock.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu CompStock_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property CompStock, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property CompStock_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_stock.png
		/// </remarks>
		public static System.Drawing.Image CompStock_Cached
		{
			get
			{
				if (_CompStock == null) _CompStock = CompStock;
				return _CompStock;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_stock.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image CompStock_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompStock_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompStock_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_stock.png
		/// </remarks>
		public static System.Drawing.Image CompStock { get { return _ImageCreateFrom(_CompStock_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru comp_stock.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompStock_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompStock_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_stock.png
		/// </remarks>
		public static System.Drawing.Image CompStock_FromFile { get { return _ImageCreateFrom(_CompStock_string, "comp_stock.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru CompStock
		/// </summary>
		/// <returns></returns>
		private static string _CompStock_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(832);
				sb.Append("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3");
				sb.Append("YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAd1JREFUOE9jYAACLqH/hkC8AohPAfEZAhikZjUQW4D0gjQbC8j9/+XY8P9/8OL//0OW4McgNU5N//8Lyv//A9RrAzJg");
				sb.Append("lVPj//9pJyE49cS//y6tK/8ru4b/F9Uy/S9r4fHfOLXhv13V7P9u3Rvg6lza/v8H6t0KMuA0yFSQ5sQDX/5Lm7n8BzoMO2Zk/O81eRdYLcilIK+CDDgD4oAEdSMKUDQq");
				sb.Append("2Af8D5h3EuwCJhY2sJyMhTtuA7hEpFAMUHaL/J9y7DdYg0ff1v/MbBz/5ay9cRvALSaD4XROIfH/Gv6p/72n7PkftekR0JufcRtgEF+J2/9A50sZO/6P3/0WtwEpR37+");
				sb.Append("B/kbZyACDVFyCcNuQMKe9/8NE6v/Jx369t+5Zfl/cT1roEGMGIaBwiH1+F/MWPCbeQisWCcsDx7XkRvug52N7CIWDi5wWsGIxtgdL/8zMjL9ZwDGNSja4na++p9y9Od/");
				sb.Append("zYA01JhxCcfwwulgaDqQs/HB639BRa3/MdueYxiw3qUVkpAS9n74b5bd8V/axPk/KPpArmFh5/wvpm323zyn838SMKXCkrx7Nzgl7gSlRBtBxf9/3boIZyRYRnPv+f9f");
				sb.Append("SPn/P6BeN1iOdARydhGRlWFZfTdQrQdIMwAUwwsNUcc7ogAAAABJRU5ErkJggg==");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property CompStock_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void CompStock_Reset()
		{
			_CompStock = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití CompStock_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _CompStock = null;
		#endregion
		#region Image CompSuppErr
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_supp_err.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu CompSuppErr_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property CompSuppErr, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property CompSuppErr_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_err.png
		/// </remarks>
		public static System.Drawing.Image CompSuppErr_Cached
		{
			get
			{
				if (_CompSuppErr == null) _CompSuppErr = CompSuppErr;
				return _CompSuppErr;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_supp_err.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image CompSuppErr_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompSuppErr_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompSuppErr_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_err.png
		/// </remarks>
		public static System.Drawing.Image CompSuppErr { get { return _ImageCreateFrom(_CompSuppErr_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru comp_supp_err.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompSuppErr_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompSuppErr_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_err.png
		/// </remarks>
		public static System.Drawing.Image CompSuppErr_FromFile { get { return _ImageCreateFrom(_CompSuppErr_string, "comp_supp_err.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru CompSuppErr
		/// </summary>
		/// <returns></returns>
		private static string _CompSuppErr_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(688);
				sb.Append("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVU");
				sb.Append("IHYzLjUuMTAw9HKhAAABfklEQVQ4T2NgAIIXNxkMgXgFEJ8C4jMEMEjNaiC2AOkFaTZ+cYrh14sChv8vwonE+UB1xxn+APXagAxYdTeX4X+eFMP/SFGG/7FimDgXKDdZ");
				sb.Append("meH/NWOgRnMozgLSNxm2ggw4fcCP4T8bI8N/oIPwYi4mhv9dilADQK4FehdkwBmQ07dpo2pW5GD4vx0o1gPUwMuMKjcV6Bqwd5ENADkP2QWWvAjn9gINQZYTZ2X4/yQM");
				sb.Append("zYALhrgNuG3C8J8RzXsbvdAMOIfHAFDASbKhWtDtiGbAcX3cLgAZoAQME2RvtDugGbBPF78BEmguWOaBZsAWtFhADsTzaN7jBEbn3VA0AxaqobpAjxsSC0/MGP4HC6PK");
				sb.Append("5QATFnI0nl7ryfBfGc2PIP+qczL8FwNGGbLfPQUZ/j8GGopswPqpwETBDnQWrpTIB0xIdvwM/6erMPx/DkvKaWAv7ASlRJsXRxn+vsggMiOBUiBI81GGf0C9brAc6Qjk");
				sb.Append("7CIiK8Oy+m6gWg+QZgCR2L9dNEgh9wAAAABJRU5ErkJggg==");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property CompSuppErr_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void CompSuppErr_Reset()
		{
			_CompSuppErr = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití CompSuppErr_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _CompSuppErr = null;
		#endregion
		#region Image CompSuppOk
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_supp_ok.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu CompSuppOk_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property CompSuppOk, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property CompSuppOk_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_ok.png
		/// </remarks>
		public static System.Drawing.Image CompSuppOk_Cached
		{
			get
			{
				if (_CompSuppOk == null) _CompSuppOk = CompSuppOk;
				return _CompSuppOk;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku comp_supp_ok.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image CompSuppOk_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompSuppOk_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompSuppOk_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_ok.png
		/// </remarks>
		public static System.Drawing.Image CompSuppOk { get { return _ImageCreateFrom(_CompSuppOk_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru comp_supp_ok.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití CompSuppOk_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property CompSuppOk_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\LCS\Tools\GreenSchedule4\Planning\pic\16\comp_supp_ok.png
		/// </remarks>
		public static System.Drawing.Image CompSuppOk_FromFile { get { return _ImageCreateFrom(_CompSuppOk_string, "comp_supp_ok.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru CompSuppOk
		/// </summary>
		/// <returns></returns>
		private static string _CompSuppOk_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(748);
				sb.Append("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3");
				sb.Append("YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAZ5JREFUOE9jYACClP/OhkC8AohPAfEZAhikZjUQW4D0gjQb5/13+rX1v+3/k/9tgBhE48M2/7cB5Qv/O/0B6rUBGbBq");
				sb.Append("9Wer/9mVMv/DksT+R6VJYOCsCpn//QtV/198Y/b/0X9rMN4JNASodyvIgNMLLxv9Z2Nn+g90EF7Mxc38v226MtgAkCtBXgUZcAbE2XhCD0WzggrH/80n9f93zFL5z8vP");
				sb.Append("jCI3cYkapgEXXpuhKLKw54M7t3O2CoqcmCTb/6O/rFFdcPqpKU4Drn60+M/IhOq9yYf0UA048cgEpwEgP0vIsKHI581URTXg0G0jvAYoqXGiyGdNUUE1YOdFA/wukEZ1");
				sb.Append("Qcc2HVQD1h9DjQXkQDz5GDV8OLmY/u8Dph2UaJy7URPFBbrGPOBYuPfb6n9AtCiKXGa5NEo0nu7fp/tfSR3Vj6BEpabN9V9UghVFs3uA0P+7P61QDFifvkQDb0oEJSRb");
				sb.Append("F4H/k5ep/X/4D5KU90BS4k5QSrQp/u/0dzfBTITIYHuBaoF6/gH1usFypCOQs4uIrAzL6ruBaj1AmgE1KwdWMMnpdgAAAABJRU5ErkJggg==");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property CompSuppOk_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void CompSuppOk_Reset()
		{
			_CompSuppOk = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití CompSuppOk_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _CompSuppOk = null;
		#endregion
        #region SPOLEČNÉ METODY PRO KONVERZI
        /// <summary>
        /// Vrátí Image z definice (string). Image generuje buď v paměti, anebo s pomocí souboru.
        /// Pokud není zadán parametr (cacheFileName) (když je null), generuje se Image v paměti.
        /// Pokud je soubor (cacheFileName) definován, pak se Image čte z něj.
        /// Pokud soubor neexistuje, nejprve se vytvoří.
        /// Umístění souboru (adresář) je dán property _ImageCacheDir, defaultně je to adresář (Sys:\Documents and Settings\All Users\Data aplikací\IconCache).
        /// Obsah obrázku definuje metoda getDataMethod.
        /// </summary>
        /// <param name="getDataMethod"></param>
        /// <param name="cacheFileName"></param>
        /// <returns></returns>
        private static System.Drawing.Image _ImageCreateFrom(_GetStringDelegate getDataMethod, string cacheFileName)
        {
            System.Drawing.Image image;
            if (cacheFileName == null)
            {
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(getDataMethod())))
                {
                    image = System.Drawing.Image.FromStream(ms);
                }
                return image;
            }
            string fileName = System.IO.Path.Combine(_ImageCacheDir, cacheFileName);
            if (!System.IO.File.Exists(fileName))
                System.IO.File.WriteAllBytes(fileName, Convert.FromBase64String(getDataMethod()));
            if (System.IO.File.Exists(fileName))
                return Image.FromFile(fileName);
            return null;
        }
        /// <summary>
        /// Obsahuje jméno adresáře, který slouží jako Cache pro obrázky systému.
        /// </summary>
        private static string _ImageCacheDir
        {
            get
            {
                string dirName = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), "GreenScheduler\\Planning16");
                if (!System.IO.Directory.Exists(dirName))
                    System.IO.Directory.CreateDirectory(dirName);
                return dirName;
            }
        }
        /// <summary>
        /// Předpis pro metody, které generují obsah souboru s daty
        /// </summary>
        /// <returns></returns>
        private delegate string _GetStringDelegate();
        /// <summary>
        /// Vrátí Icon z dat (string), která jsou předána na vstup v kódování Base64
        /// </summary>
        /// <param name="data">Vstupní data v kódování Base64</param>
        /// <returns>Icon vytvořená z dat</returns>
        public static System.Drawing.Icon ConvertStringToIcon(string data)
        {
            System.Drawing.Icon icon;
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
            {
                icon = new System.Drawing.Icon(ms);
            }
            return icon;
        }
        /// <summary>
        /// Vrátí Cursor z dat (string), která jsou předána na vstup v kódování Base64
        /// </summary>
        /// <param name="data">Vstupní data v kódování Base64</param>
        /// <returns>Cursor vytvořený z dat</returns>
        public static System.Windows.Forms.Cursor ConvertStringToCursor(string data)
        {
            System.Windows.Forms.Cursor cursor;
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
            {
                cursor = new System.Windows.Forms.Cursor(ms);
            }
            return cursor;
        }
        #endregion
    }
}
